跳到主要内容

Ubuntu和WSL学习

概述

因为之前那篇 Linux 的文章内容已经涉及到太多内容了(且杂)所以有关 Ubuntu 相关的笔记丢到这里

这里主要是使用 WSL 因为通过 VM 开启一个 Linux 虚拟机实在太慢了(且不流畅),不如这个原生子系统的支持那么好,所以这篇也算是记录 WSL 上的坑

WSL 最令人迷惑的就是那个根目录

WSL1 的根目录

C:\Users\alsritter\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu18.04onWindows_79rhkp1fndgsc\LocalState\rootfs

WSL2 的根目录(比较神奇的是这是个网络路径)

\\wsl$\Ubuntu-18.04

注意:不过官方不建议直接通过资源管理器修改文件 参考官方 Do not change Linux files using Windows apps and tools

Ubuntu 桌面版和服务器版的区别

Ubuntu 桌面版(Ubuntu Desktop)和服务器版(Ubuntu Server)区别就是桌面版带 gui,服务器版本不带

使用 WSL 和 vscode 配合使用,需要使用管理员打开终端

终端到自己想要编辑的目录下输入 code . 就会自动打开 vscode (第一次安装那个插件需要重启,否则打不开...)

且目录也需要使用有权限

使用 XShell 连接 WSL

要先重装 ssh

sudo apt-get remove openssh-server
sudo apt-get install openssh-server

因为默认的 ssh 的是 22 端口,而 Windows 的 22 端口被占用了,所以需要手动更改下端口

sudo vim /etc/ssh/sshd_config

改下配置文件

Port 2222  #默认的是22,但是windows有自己的ssh服务,也是监听的22端口,所以这里要改一下
UsePrivilegeSeparation no
PasswordAuthentication yes
PermitRootLogin yes # 允许 root 登陆
AllowUsers youusername # 这里改成你登陆WSL用的

启动 ssh server(但是必须保持这个终端打开,关掉了就无法连接了)

sudo service ssh --full-restart

设置中文环境

执行区域设置重新配置本地化

sudo dpkg-reconfigure locales

选择 zh_CN.UTF-8

配置好之后关掉 shell 再重新打开

# 打印当前的环境
echo $LANG

更新为 wsl2

查看当前的 wsl 版本

wsl -l -v

#===============
NAME STATE VERSION
* Ubuntu-18.04 Stopped 1
#================
# 启用虚拟机平台可选组件
Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform
# 切换 Ubuntu-18.04 为 wsl2
wsl --set-version Ubuntu-18.04 2

# 使得之后安装的 Linux 子系统都安装到 WSL2 中
wsl --set-default-version 2

WSL2 占用内存问题

参考资料 解决WSL2中Vmmem内存占用过大问题教程 参考资料 官方用法 参考资料 wsl 内存泄漏 bug issue

按下Windows + R 键,输入 %UserProfile% 并运行进入用户文件夹

新建文件 .wslconfig

[wsl2]
memory=2GB
swap=0
localhostForwarding=true

然后打开 powershell,输入 wsl --shutdown 来关闭当前的子系统,然后会弹框提醒重启 wsl

snapd 包管理器

安装

apt-get install snapd

如果是 Wsl2

$ sudo apt-get update \
&& sudo apt-get install -yqq daemonize dbus-user-session fontconfig

snapd 和 apt/apt-get 的区别?

snap 和 apt 都是包管理系统,apt 被设计用于Debian发行版,比如 Ubuntu,而 snap 是通用的,用于各种 Linux发行版。apt 只是将包的内容安装在包说明中指定的位置,以这种方式安装的软件需要系统或第三方库,而 snap 是自包含的,在沙盒中运行,不直接与主机系统相关。

WSL 代理

如果使用 Clash for Windows 则更方便

export hostip=$(cat /etc/resolv.conf |grep -oP '(?<=nameserver\ ).*')
export https_proxy="http://${hostip}:7890"
export http_proxy="http://${hostip}:7890"

测试:

sudo apt install w3m
w3m www.google.com

如果是 ip 地址需要加上完整的协议头

w3m http://10.10.10.10:8080

Wsl2 的初始化系统

因为 Wsl2 使用不是 systemd,所以应该使用 service 来检查

检查当前的服务

$ service --status-all
[ - ] apparmor
[ ? ] apport
[ + ] atd
[ - ] console-setup.sh
[ + ] cron
...
  • [+] 代表服务是在启动运行的状态
  • [-] 代表服务是在关闭停止的状态systemctl 命令
  • [?] 这个状态标识服务在初始化或者启动时没有输出有效的状态

使用 service 启动一个服务

$ service nginx start

可以理解成 service 就是 init.d 的一种实现方式。 所以这两者启动方式(或者是停止、重启)并没有什么区别。

$ sudo /etc/init.d/nginx start
# 等价于
$ service nginx start

但是这两种方式均有如下缺点:

  • 启动时间长:init 进程是串行启动,只有前一个进程启动完,才会启动下一个进程。
  • 启动脚本复杂:init 进程只是执行启动脚本,不管其他事情,脚本需要自己处理各种情况,这往往使得脚本变得很长。

使用 systemd

使用这个 脚本

mkdir caches && cd caches
git clone https://github.com/DamionGans/ubuntu-wsl2-systemd-script.git
cd ubuntu-wsl2-systemd-script/
bash ubuntu-wsl2-systemd-script.sh

随后重启 WSL

wsl --shutdown

然后打开 WSL,尝试 systemctl:

systemctl

References